const jwt = require("jsonwebtoken");
const { Unauthorized } = require("http-errors");
const { failure } = require("../utils/responses");
const { userSessions, userInfo } = require("../utils/userInfo");
module.exports = async (req, res, next) => {
  try {
    for (let value in userSessions) {
      console.log("values=====", userSessions[value]);
    }

    // 判断 Token 是否存在
    const { token } = req.headers;
    if (!token) {
      throw new Unauthorized("当前接口需要认证才能访问。");
    } else if (token == "undefined") {
      throw new Unauthorized("当前用户需要重新登录");
    }

    const clientSessionId = req.headers["x-session-id"];

    if (!clientSessionId || clientSessionId == "undefined") {
      throw new Unauthorized("请设置 x-session-id");
    }

    // 验证 token 是否正确
    const decoded = jwt.verify(token, process.env.SECRET);

    // 从 jwt 中，解析出之前存入的 userId
    const { userId } = decoded;

    let { user } = await userInfo(req);
    if (!user) {
      throw new Unauthorized("用户不存在。");
    }
    if (user.role != 100) {
      throw new Unauthorized("您没有权限使用当前接口。");
    }

    if (!userSessions[user.id]) {
      throw new Unauthorized("请重新登录。");
    }
    if (
      clientSessionId &&
      userSessions[user.id] &&
      userSessions[user.id] !== clientSessionId
    ) {
      throw new Unauthorized("您的账号已在其他地方登录。");
    }

    // 如果通过验证，将 userId 挂载到 req 上，方便后续中间件或路由使用
    req.userId = userId;
    // 如果通过验证，将 user 对象挂载到 req 上，方便后续中间件或路由使用
    req.user = user;

    // 一定要加 next()，才能继续进入到后续中间件或路由
    next();
  } catch (error) {
    failure(req, res, error);
  }
};
